home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / ASY.C < prev    next >
C/C++ Source or Header  |  1989-08-16  |  3KB  |  131 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "iface.h"
  4. #include "asy.h"
  5. #include "ax25.h"
  6. #include "kiss.h"
  7. #include "slip.h"
  8. #include "nrs.h"
  9. #include "config.h"
  10. #include "proc.h"
  11. #include "commands.h"
  12.  
  13. /* Attach a serial interface to the system
  14.  * argv[0]: hardware type, must be "asy"
  15.  * argv[1]: I/O address, e.g., "0x3f8"
  16.  * argv[2]: vector, e.g., "4"
  17.  * argv[3]: mode, may be:
  18.  *        "slip" (point-to-point SLIP)
  19.  *        "ax25" (AX.25 frame format in SLIP for raw TNC)
  20.  *        "nrs" (NET/ROM format serial protocol)
  21.  * argv[4]: interface label, e.g., "sl0"
  22.  * argv[5]: receiver ring buffer size in bytes
  23.  * argv[6]: maximum transmission unit, bytes
  24.  * argv[7]: interface speed, e.g, "9600"
  25.  */
  26. int
  27. asy_attach(argc,argv,p)
  28. int argc;
  29. char *argv[];
  30. void *p;
  31. {
  32.     register struct iface *if_asy;
  33.     int16 dev;
  34.     int mode;
  35.  
  36.     if(Nasy >= ASY_MAX){
  37.         printf("Too many asynch controllers\n");
  38.         return -1;
  39.     }
  40.     if(if_lookup(argv[4]) != NULLIF){
  41.         printf("Interface %s already exists\n",argv[4]);
  42.         return -1;
  43.     }
  44.     if(strcmp(argv[3],"slip") == 0)
  45.         mode = SLIP_MODE;
  46.     else if(strcmp(argv[3],"ax25") == 0)
  47.         mode = AX25_MODE;
  48.     else if(strcmp(argv[3],"nrs") == 0)
  49.         mode = NRS_MODE;
  50.     else 
  51.         mode = UNKNOWN;
  52.  
  53.     dev = Nasy++;
  54.  
  55.     /* Create interface structure and fill in details */
  56.     if_asy = (struct iface *)calloc(1,sizeof(struct iface));
  57.     if_asy->name = strdup(argv[4]);
  58.     if_asy->mtu = atoi(argv[6]);
  59.     if_asy->dev = dev;
  60.     if_asy->stop = asy_stop;
  61.     Slip[dev].iface = if_asy;
  62.  
  63.     switch(mode){
  64. #ifdef    SLIP
  65.     case SLIP_MODE:
  66.         if_asy->ioctl = asy_ioctl;
  67.         if_asy->send = slip_send;
  68.         if_asy->output = NULLFP;    /* ARP isn't used */
  69.         if_asy->raw = slip_raw;
  70.         if_asy->flags = 0;
  71.         Slip[dev].type = TYPE_IP;
  72.         newproc("asy rx",256,asy_rx,dev,NULL,NULL);
  73.         break;
  74. #endif
  75. #ifdef    AX25
  76.     case AX25_MODE:  /* Set up a SLIP link to use AX.25 */
  77.         axarp();
  78.         if(Mycall.call[0] == '\0'){
  79.             printf("set Mycall first\n");
  80.             free(if_asy->name);
  81.             free((char *)if_asy);
  82.             Nasy--;
  83.             return -1;
  84.         }
  85.         if_asy->ioctl = kiss_ioctl;
  86.         if_asy->send = ax_send;
  87.         if_asy->output = ax_output;
  88.         if_asy->raw = kiss_raw;
  89.         if(if_asy->hwaddr == NULLCHAR)
  90.             if_asy->hwaddr = malloc(sizeof(Mycall));
  91.         memcpy(if_asy->hwaddr,(char *)&Mycall,sizeof(Mycall));
  92.         Slip[dev].type = TYPE_KISS;
  93.         newproc("asy rx",256,asy_rx,dev,NULL,NULL);
  94.         break;
  95. #endif
  96. #ifdef    NRS
  97.     case NRS_MODE: /* Set up a net/rom serial iface */
  98.         /* no call supplied? */
  99.         if(Mycall.call[0] == '\0'){
  100.             printf("set mycall first\n");
  101.             free(if_asy->name);
  102.             free(if_asy);
  103.             Nasy--;
  104.             return -1;
  105.         }
  106.         if_asy->ioctl = asy_ioctl;
  107.         if_asy->send = ax_send;
  108.         if_asy->output = ax_output;
  109.         if_asy->raw = nrs_raw;
  110.         if_asy->hwaddr = malloc(sizeof(Mycall));
  111.         memcpy(if_asy->hwaddr,(char *)&Mycall,sizeof(Mycall));
  112.         Nrs[dev].iface = if_asy;
  113.         newproc("nrs rx",256,nrs_recv,dev,NULL,NULL);
  114.         break;
  115. #endif
  116.     default:
  117.         printf("Mode %s unknown for interface %s\n",
  118.             argv[3],argv[4]);
  119.         free(if_asy->name);
  120.         free((char *)if_asy);
  121.         Nasy--;
  122.         return -1;
  123.     }
  124.     if_asy->next = Ifaces;
  125.     Ifaces = if_asy;
  126.     asy_init(dev,if_asy,argv[1],argv[2],(unsigned)atoi(argv[5]));
  127.     asy_speed(dev,atoi(argv[7]));
  128.     return 0;
  129. }
  130.  
  131.